/* ************************************************************************

   Copyright:
     2008 openWorks

   License:
     LGPL: http://www.gnu.org/licenses/lgpl.html
     See the LICENSE file in the project's top-level directory for details.

   Authors:
     * Juan Matias Granda
	 * Martin Alejandro Paz

************************************************************************ */

/**
* Objeto creado con un {@link qx.ui.basic.Label} y un {@link  qx.ui.form.TextArea}.
* 
* *Ejemplo:*
*
* <pre class='javascript'>
*  var txaTexto = new qx.ui.form.ow.TextArea("Label:");
*  </pre>
*/

qx.Class.define("qx.ui.form.ow.TextArea",
{
	extend : qx.ui.container.Composite,
	/**
	* @param label {String} valor inicial del Label que acompaña al *qx.ui.form.TextArea*.
	* @param type {String} tipo de dato que se verificara (usa la clase Validador {@link qx.ui.form.ow.Validator}).
	* @param require {Boolean} true en caso de que el valor sea requerido (obligatorio).
	* @param hAlign {Boolean ? false} _true_ si se quiere distribuir los objetos horizontalmente.
	*/
	construct : function (label, type, require, hAlign)
	{
		this.base(arguments);

		if (hAlign){
			this.setLayout(new qx.ui.layout.HBox(1));
		}
		else {
			this.setLayout(new qx.ui.layout.VBox(1));
		}
		this._label = new qx.ui.basic.Label(label);
		this._label.setWidth(120);
		this._label.setRich(true);

		this._text = new qx.ui.form.TextArea();
		if (hAlign){
			this._text.setWidth(200);
			}
		else {
			this._text.setWidth(320);
		}
		this._text.setHeight(100);

		this._validator = new qx.ui.form.ow.Validator(type, require);
		this._colorInvalid = "red";

		this._popup = new qx.ui.popup.Popup(new qx.ui.layout.Basic()).set(
		{
			backgroundColor: "#F8FF77",
			padding: [2, 4],
			offset : 3,
			position : "top-right"
		});
		this._popup.setAutoHide(false);

		this._popup.addListener("appear", function()
		{
			this._popup.moveTo(this._text.getContainerLocation("margin").left+this._text.getWidth()+2, this._text.getContainerLocation("margin").top);
		}, this);


		this.add(this._label);
		this.add(this._text);
	},
	
/*
*****************************************************************************
     MEMBERS
*****************************************************************************
*/
	members :
	{
		_label : null,
		_text : null,
		_popup : null,
		_validator : null,
		_colorInvalid : null,
		
		/**
		* Activa el popup de warning en caso de que haya sido marcado como requerido y no se haya ingresado valor alguno.
		* @return {void}
		*/
		_paintInvalid : function ()
		{
			if (!(this.isValid()))
			{
				this._text.setDecorator("main");
				this._text.setBackgroundColor(this._colorInvalid);
				if (this._popup != null)
				{
					if (this._popup.isHidden())
					{
						this._popup.show();
						qx.event.Timer.once(function() { this._popup.hide(); },this, 1500);
					}
				}
			}
			else
			{
				this._text.setBackgroundColor("white");
				this._text.setDecorator("input-focused");
				if (this._popup != null)
				{
					this._popup.hide();
				}
			}
		},
		
		/**
		* Da foco al TextArea.
		* @return {void}
		*/
		focus : function () { this._text.focus(); },
		
		/**
		* Devuelve el objeto *qx.ui.basic.Label*.
		* @return {qx.ui.basic.Label}
		*/
		getLabel : function () { return this._label; },
		
		/**
		* Devuelve el objeto *qx.ui.form.TextArea*.
		*
		* @return {qx.ui.form.TextArea}
		*/
		getText : function () { return this._text; },
		
		/**
		* Devuelve el texto del *qx.ui.form.TextArea*.
		* @return {String[]}
		*/
		getValue : function () { return this._text.getValue(); },
		
		/**
		* Asigna el tipo al validador del TextArea.
		* @param type {String} tipo de dato que sera verificado (usa la clase Validador {@link qx.ui.form.ow.Validator}).
		* @param require {Boolean} true en caso de que el valor sea requerido (obligatorio).
		*/
		setType : function (type, require) { this._validator = new qx.ui.form.ow.Validator(type, require); },
		
		/**
		* Asigna el texto del *qx.ui.form.TextArea*.
		* @param value {String} Texto que se quiere asignar.
		* @return {String[]}
		*/		
		setValue : function (value) { this._text.setValue(value); },
		
		/**
		* Permite crear un mensaje personalizado ingresando el texto e icono cuando *isValid()* nos devuelva _false_.
		* @param text {String} Valor del mensaje que sera mostrado al activarse el warning.
		* @param icon {String} Icono que acompañara al mensaje.
		*/
		setVisibleWarning : function (text, icon)
		{
			if ((text != null) && (text != ''))
			{
				this._popup.add(new qx.ui.basic.Atom(text, icon));
			}
			else
			{
				this._popup.add(new qx.ui.basic.Atom("El dato ingresado no es valido!", icon));
			}
		},
		
		/**
		* Activa la validacion en linea para comprobar si el objeto *qx.ui.form.TextArea* posee una expresion regular valida.
		* @param color {String} cadena *hexadecimal* con el codigo del color o colores basicos en ingles que coloreara el objeto al ingresar una cadena invalida.
		*/
		checkInput : function (color)
		{
			if (color != undefined)
			{
				this._colorInvalid = color;
			}
			this._text.addListener("focusout", this._paintInvalid, this);
			this._text.addListener("focusin", function ()
			{
				this._text.setBackgroundColor("white");
				this._text.setDecorator("input-focused");
				if (this._popup != null)
				{
					this._popup.hide();
				}
			}, this);
		},
		
		/**
		* Devuelve _true_ o _false_ si es que el objeto *qx.ui.form.TextArea* posee una expresion regular valida.
		*/		
		isValid : function () { return this._validator.isValid(this._text.getValue()); },
		focus : function ()
		{
			this._text.focus();
		}
	}
});